#include <iostream>
#include <iomanip>
using namespace std;

int board[1025][1025]; // 棋盘数组
static int tile = 1;   // 瓦片编号

// (tr,tc)表示棋盘左上角的起始点坐标
// (dr,dc)表示棋盘中无法被放置的特殊方格坐标
// size表示问题规模，也就是边长
void ChessBoard(int tr, int tc, int dr, int dc, int size)
{

    if (size == 1) // 递归出口
        return;

    int t = tile++;   // 瓦片+1，也表示执行次函数次数，每执行一次放一次瓦片
    int s = size / 2; // 将问题规模缩小一半，对于正方形来说，是直接分成四部分

    // 对左上角的子问题进行分析
    if (dr < tr + s && dc < tc + s)
        ChessBoard(tr, tc, dr, dc, s);
    else
    {
        // 如果本块无特殊方块，表示我们可以放入瓦片，那么在本块的右下角放置瓦片
        board[tr + s - 1][tc + s - 1] = t;
        ChessBoard(tr, tc, tr + s - 1, tc + s - 1, s);
    }

    // 右上
    if (dr < tr + s && dc >= tc + s)
        ChessBoard(tr, tc + s, dr, dc, s);
    else
    {
        board[tr + s - 1][tc + s] = t;
        ChessBoard(tr, tc + s, tr + s - 1, tc + s, s);
    }

    // 左下
    if (dr >= tr + s && dc < tc + s)
        ChessBoard(tr + s, tc, dr, dc, s);
    else
    {
        board[tr + s][tc + s - 1] = t;
        ChessBoard(tr + s, tc, tr + s, tc + s - 1, s);
    }

    // 右下
    if (dr >= tr + s && dc >= tc + s)
        ChessBoard(tr + s, tc + s, dr, dc, s);
    else
    {
        board[tr + s][tc + s] = t;
        ChessBoard(tr + s, tc + s, tr + s, tc + s, s);
    }
}

int main()
{
    int i, j;
    int k;
    while (cin >> k)
    {
        int size = 1 << k; // 初始化变量，并将pow(2,k)赋值给size
        int x, y;

        // 赋初值
        cin >> x >> y;
        board[x][y] = 0;

        // 执行棋盘的填充
        ChessBoard(0, 0, x, y, size);

        // 打印结果
        for (i = 0; i < size; i++)
        {
            for (j = 0; j < size; j++)
                cout << board[i][j] << "\t";
            cout << "\n";
        }
    }
    return 0;
}
